package com.hhl.lamda.streamsfilter;

import com.hhl.lamda.entity.Person;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author HHL
 * @description
 * @date 2018/11/17 - 14:35
 */
public class FindAnyOrElse {

    public static void main(String[] args) {

        List<Person> persons = Arrays.asList(
                new Person("mkyong", 30),
                new Person("jack", 20),
                new Person("lawrence", 40)
        );
        Person result = getStudentByName(persons, "jack");
        System.out.println(result);


        System.out.println();
        System.out.println();
        System.out.println();
        /* Lamda 表达式 */
        Person person1 = persons.stream()  // 将list类型的persons转化为stream
                .filter(x -> "jack".equals(x.getName())) // 过滤名字与 jack 相关的所有人
                .findAny()  // 如果存在名字与 jack 相关的人，返回这个人
                .orElse(null);  // 如果不存在，返回 null
        System.out.println("jack" + person1);



        Person person2 = persons.stream() // 将list类型的persons转化为stream
                .filter(x -> "ahmook".equals(x.getName())) // 过滤名字与 jack 相关的所有人
                .findAny()  // 如果存在名字与 jack 相关的人，返回这个人
                .orElse(null);  // 如果不存在，返回 null
        System.out.println("ahmook" + person2);



        Person person3 = persons.stream()
                .filter((x) -> "jack".equals(x.getName()) && 20 == x.getAge())
                .findAny()
                .orElse(null);
        System.out.println("多条件过滤=" + person3);



        Person person4 = persons.stream()
                .filter(p -> {

                    if ("jack".equals(p.getName()) && 20 == p.getAge()) {
                        return true;
                    }
                    return false;
                }).findAny()
                .orElse(null);
        System.out.println("多条件过滤2=" + person4);


        System.out.println();
        System.out.println();
        System.out.println();
        /* Streams filter() and map() */
        String name = persons.stream()// 将list类型的persons转化为stream
                .filter(person -> "jack".equals(person.getName())) // 过滤名字与 jack 相关的所有人
                .map(Person::getName)  // 获取遍历的每一个person的名字
                .findAny()  // 如果存在名字与 jack 相关的人，返回这个人
                .orElse("");  // 如果不存在，返回 ""
        System.out.println("name" + name);




        System.out.println();
        System.out.println();
        System.out.println();
        List<String> collect = persons.stream()// 将list类型的persons转化为stream
                .map(Person::getName) // 获取遍历的每一个person的名字
                .collect(Collectors.toList()); // 收集遍历到的每一个person的名字并将收集到的所有名字转化为list集合
        collect.forEach(System.out::print);
        System.out.println();



    }


    private static Person getStudentByName(List<Person> persons, String name) {

        Person result = null;
        for (Person temp : persons) {
            if (name.equals(temp.getName())) {
                result = temp;
            }
        }
        return result;
    }
}
